{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "07b2a8ec",
   "metadata": {},
   "source": [
    "# CartoLayer\n",
    "\n",
    "Render cloud from a CARTO connection using deck.gl [CartoLayer](https://deck.gl/docs/api-reference/carto/carto-layer)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "30353b70",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pydeck as pdk\n",
    "import pydeck_carto as pdkc\n",
    "from carto_auth import CartoAuth"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f4a7e937",
   "metadata": {},
   "outputs": [],
   "source": [
    "carto_auth = CartoAuth.from_oauth()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f90a430c",
   "metadata": {},
   "outputs": [],
   "source": [
    "pdkc.register_carto_layer()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b703385",
   "metadata": {},
   "source": [
    "## CARTO DW\n",
    "\n",
    "Every CARTO account has a **CARTO Data Warehouse** to work with. In this example, a table with world airports from the CARTO DW is rendered."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dfebc544",
   "metadata": {},
   "outputs": [],
   "source": [
    "layer = pdk.Layer(\n",
    "    \"CartoLayer\",\n",
    "    data=\"carto-demo-data.demo_tables.world_airports\",\n",
    "    type_=pdkc.MapType.TABLE,\n",
    "    connection=pdkc.CartoConnection.CARTO_DW,\n",
    "    credentials=pdkc.get_layer_credentials(carto_auth),\n",
    "    get_fill_color=[238, 77, 90],\n",
    "    point_radius_min_pixels=2.5,\n",
    "    pickable=True,\n",
    ")\n",
    "\n",
    "view_state = pdk.ViewState(latitude=0, longitude=0, zoom=1)\n",
    "\n",
    "tooltip = {\"html\": \"<b>Name:</b> {name}\", \"style\": {\"color\": \"white\"}}\n",
    "\n",
    "pdk.Deck(\n",
    "    layer, map_style=pdk.map_styles.ROAD, initial_view_state=view_state, tooltip=tooltip\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f89456a7",
   "metadata": {},
   "source": [
    "## Data Warehouses\n",
    "\n",
    "CARTO allows rendering cloud data from **BigQuery, Snowflake, Redshift, Postgres and Databricks** using custom connections.\n",
    "\n",
    "This example performs a spatial intersection to display the airports in Spain. Note that it uses a BigQuery connection called \"bigquery\"."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "172e318c",
   "metadata": {},
   "outputs": [],
   "source": [
    "layer = pdk.Layer(\n",
    "    \"CartoLayer\",\n",
    "    data=\"\"\"\n",
    "        SELECT a.geom, a.name\n",
    "        FROM `carto-demo-data.demo_tables.world_airports` AS a,\n",
    "             `carto-do-public-data.natural_earth.geography_glo_admin0countries_410` AS g\n",
    "        WHERE g.ADMIN = 'Spain' AND\n",
    "              ST_INTERSECTS(a.geom, g.geom)\n",
    "    \"\"\",\n",
    "    type_=pdkc.MapType.QUERY,\n",
    "    connection=pdk.types.String(\"bigquery\"),\n",
    "    credentials=pdkc.get_layer_credentials(carto_auth),\n",
    "    get_fill_color=[238, 77, 90],\n",
    "    point_radius_min_pixels=2.5,\n",
    "    pickable=True,\n",
    ")\n",
    "\n",
    "view_state = pdk.ViewState(latitude=36, longitude=-7.44, zoom=4)\n",
    "\n",
    "tooltip = {\"html\": \"<b>Name:</b> {name}\", \"style\": {\"color\": \"white\"}}\n",
    "\n",
    "pdk.Deck(\n",
    "    layer, map_style=pdk.map_styles.ROAD, initial_view_state=view_state, tooltip=tooltip\n",
    ")"
   ]
  },
  {
   "attachments": {
    "error-message-column.png": {
     "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9QAAAA6CAYAAABRchHrAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AABmXSURBVHic7d15UBRXHgfwbw/IgCDggcihKKfggRGUGDXsrmciBjwQXQ8MGrWUVXRNadRdr6hU0CQKbIzGK2o2SlyPaCSK61USo5KAYDwAoxgP4g1RlOu3f1jTy8g1DBpM8v1UTen06+n3evq9Hn7Tr3+jiIiAiIiIiIiIiGpEU9cNICIiIiIiIvotYkBNREREREREZAQG1ERERERERERGYEBNREREREREZAQG1ERERERERERGYEBNREREREREZAQG1ERERERERERGYEBNREREREREZAQG1ERERERERERGYEBNREREREREZAQG1ERERERERERGYEBNREREREREZAQG1ERERERERERGYEBNREREREREZAQG1ERERERERERGYEBNREREREREZAQG1ERERERERERGYEBNREREREREZAQG1ERERERERERGYEBNREREREREZAQG1PTCGDFiBEaPHl3XzSD6zZo6dSoaN24MRVEwZ86cOm3LJ598gpYtWxr12pkzZ6Jv377PtkFPSUxMhLm5uUHr/tHPTbdu3YKiKFAUBR06dKjr5lRqxIgRajuTkpLqujlERPQHUecBdXR0NBRFQVRUVF03pVY+//xz9YP86cfvzaZNm9R902g0cHR0xNixY3Hnzp26btpv2o4dO2BlZfXctu/v7w9FUXD27Fl12dixY9GzZ8/nVicZpkOHDli6dGmttvHNN98gLi4OiYmJuHv3bp0H1LXh5+eHXr16Pdc6nJycMHLkyOdax4vg3r17UBQFp06dqvW20tPTkZqaqrcsKSkJffr0QZMmTWBra4uePXvWuK5Hjx7hzTffhI+PDzQaDcaOHVtuncWLFyMgIABarRbu7u4VbmfTpk0QkRrVTUREVFt1HlD/3tjY2MDX11fv8XuVkZGBM2fOYP369Th69CgmTpxY102iamg0GvzrX/+q62bQc5CdnY2mTZuiU6dOsLW1Nfjq64soNDQUf//7359rHe3atcPq1aufax1/BLt370bbtm2xYcMG7Ny5E+bm5ujVqxeuXr1q8DZKSkpgZmaG6dOnV/qZWVBQgGHDhmHIkCHPqulE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"
    }
   },
   "cell_type": "markdown",
   "id": "cb826ce8",
   "metadata": {},
   "source": [
    "### Error management\n",
    "\n",
    "Any data error is displayed instead of the map to provide instant feedback about the input parameters. For example, the user is not authorized, the connection or the column names do not exist, etc.\n",
    "\n",
    "![error-message-column.png](attachment:error-message-column.png)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  },
  "vscode": {
   "interpreter": {
    "hash": "397f9d86bc6cffaf98711878e048d4ea1b6f37d57e9a5761ac2bec56bfc5b368"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
